package com.chase.framerwork.util;

import java.io.File;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;

import com.chase.framerwork.exception.SysException;

/**
 * 路径工具类
 * 
 * @Author Chase
 * @Date 2013-10-29
 */
public class PathUtil
{

	/**
	 * WebRoot或者是WebContent
	 */
	private static final String WEB_ROOT = "WebRoot";

	/**
	 * 默认Web路径
	 */
	private static final String DEFAULT_WEB_PATH = "/" + WEB_ROOT + "/WEB-INF/";

	/**
	 * 得到web应用的绝对路径 例如 D:\work\testPE\WebRoot\
	 * 
	 * @return String 绝对路径
	 */
	public static String getWebRootPath()
	{
		String classPath = getClassPath();
		String webInfUrl = classPath.substring(0, classPath.indexOf("classes"));
		String webContentUrl = webInfUrl.substring(0, classPath.indexOf("WEB-INF"));
		return webContentUrl;
	}

	/**
	 * 得到WEB-INF的绝对路径 例如 D:\work\testPE\WebRoot\WEB-INF\
	 * 
	 * @return String 获取WEB-INF的绝对路径
	 */
	public static String getWebInfPath()
	{
		String classPath = getClassPath();
		String webInfUrl = classPath.substring(0, classPath.indexOf("classes"));
		return webInfUrl;
	}

	/**
	 * 获取WEB-INF下的指定的path路径 例如 D:\work\testPE\WebRoot\config\
	 * 
	 * @param path
	 *            需要获取的Path
	 * @return String 获取path的绝对路径
	 */
	public static String getAppPath(String path)
	{
		String classPath = getClassPath();
		String webInfUrl = classPath.substring(0, classPath.indexOf("classes"));
		String webrootUrl = webInfUrl.substring(0, classPath.indexOf("WEB-INF"));
		String confUrl = webrootUrl + path + "/";
		File file = new File(confUrl);
		if (!file.exists())
		{
			throw new SysException(WEB_ROOT + "目录下不存在该文件夹");
		}
		return confUrl;
	}

	/**
	 * 方法描述：获取WEB-INF下的classes路径 例如 D:\work\testPE\WebRoot\WEB-INF\classes\
	 * 
	 * @return ClassPath 绝对路径
	 */
	public static String getClassPath()
	{
		String classPath = getClassPath(PathUtil.class);
		String classPathUrl = null;
		try
		{
			classPathUrl = classPath.substring(0, classPath.indexOf("classes"));
		}
		catch (Exception e)
		{
			File file = new File("");

			classPathUrl = file.getAbsolutePath() + DEFAULT_WEB_PATH;
		}
		classPathUrl += "classes/";
		return classPathUrl;
	}

	/**
	 * 获取 String绝对路径 注意：适合在非web项目中使用
	 */
	public static String getAbsolutePath()
	{
		return getAbsolutePath("");
	}

	/**
	 * 获取 String绝对路径,如果要获得当前class路径，可以直接把resource设置为“”
	 */
	public static String getAbsolutePath(String resource)
	{
		return getUrl(resource).getPath();
	}

	/**
	 * 获取 URL 绝对路径,此方法可能会不适合在那种自己写类装载器的环境中使用
	 */
	public static URL getUrl(String resource)
	{
		return Thread.currentThread().getContextClassLoader().getResource(resource);
	}

	/**
	 * 根据class获取web应用的路径绝对路径
	 * 
	 * @param c
	 *            用来定位的类
	 * @return ClassPath 绝对路径
	 */
	private static String getClassPath(Class<?> c)
	{
		ProtectionDomain pd = c.getProtectionDomain();
		if (pd == null)
		{
			return null;
		}
		CodeSource cs = pd.getCodeSource();
		if (cs == null)
		{
			return null;
		}
		URL url = cs.getLocation();
		if (url == null)
		{
			return null;
		}
		String classPath = url.getPath();
		return classPath;
	}
}
